# 协程：当程序遇见 IO 操作的时候，可以选择性的切换到其他任务上
#       微观上，是一个任务一个任务的进行切换，切换条件一般是 IO 操作
#       宏观上，我们能看到的是多个任务一起执行


# 多任务异步协程
import asyncio
import time

'''
async def fun():
    print('Hello, My name is 索菲亚')


if __name__ == '__main__':
    g = fun()  # 此时的函数是异步协程函数，此时函数执行得到的是一个协程对象
    asyncio.run(g)  # 协程程序运行需要 asyncio 模块的支持
'''


async def fun1():
    print('Hello, My name is 索菲亚1 doing······')
    # time.sleep(3)       # 当程序出现了同步操作的时候，异步就中断了
    await asyncio.sleep(3)  # 异步操作的代码
    print('索菲亚1：GoodBey Baby!')


async def fun2():
    print('Hello, My name is 索菲亚2 doing······')
    # time.sleep(2)
    await asyncio.sleep(2)  # 异步操作的代码
    print('索菲亚2：GoodBey Baby!')


async def fun3():
    print('Hello, My name is 索菲亚3 doing······')
    # time.sleep(4)
    await asyncio.sleep(4)  # 异步操作的代码
    print('索菲亚3：GoodBey Baby!')


async def fun4():
    print('Hello, My name is 索菲亚4 doing······')
    # time.sleep(5)
    await asyncio.sleep(5)  # 异步操作的代码
    print('索菲亚4：GoodBey Baby!')


if __name__ == '__main__':
    f1 = fun1()  # 此时的函数是异步协程函数。此时函数执行得到的是一个协程对象
    f2 = fun2()
    f3 = fun3()
    f4 = fun4()

    loop = asyncio.new_event_loop()
    tasks = [
        loop.create_task(i) for i in [f1, f2, f3, f4]
    ]

    # 一次性启动多个任务（协程）
    t1 = time.time()
    loop.run_until_complete(asyncio.wait(tasks))
    print('共耗时：', time.time() - t1)
